﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace DMSMT.Tool
{
    public partial class ExeSqlTranFrm : Form
    {
        public ExeSqlTranFrm()
        {
            InitializeComponent();
        }

        private void ExeSqlTranFrm_Load(object sender, EventArgs e)
        {

        }

        private void btExec_Click(object sender, EventArgs e)
        {
            string[] ips=rtbIP.Lines;
            string sql = rtbSQL.Text;
            if (ips.Length == 0)
            {
                MessageBox.Show("请输入IP列表");
                return;
            }

            if (string.IsNullOrEmpty(sql))
            {
                MessageBox.Show("请输入SQL");
                return;
            }
            foreach (string ip in ips)
            {
                try
                {
                    db.Dao.ExecuteSql(sql, db.Dao.GetCommonConn(ip));
                    Log.LogText(ip+"\tSQL执行成功!");
                }
                catch (Exception ex)
                {
                    Log.LogError(ip + "\t执行失败,错误信息:"+ex.Message);
                }
            }


            //System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo("cmd.exe", sql);
            //psi.RedirectStandardOutput = true; //重定向输出。设置为TRUE，这样我们就可以接收返回结果了。

            //psi.CreateNoWindow = true;   //不创建窗口，相当于后台运行
            //psi.UseShellExecute = false; //不使用系统Shell来启动程序
            //System.Diagnostics.Process listFiles;
            //listFiles = System.Diagnostics.Process.Start(psi);
            //System.IO.StreamReader myOutput = listFiles.StandardOutput;
            //listFiles.WaitForExit(); //等待被调用程序结束。该函数有一个重载可以设置等待时间，如果被调用的程序在指定的时间无返回值，则自动向下执行，否则就一直等待。
            
            //if (listFiles.HasExited)
            //{
               
            //   string output = myOutput.ReadToEnd();   //output为全局变量，用于保存返回结果。
               
            //   Log.LogText(output); 
            //    //this.Refresh(); //强制窗体刷新。因为本程序没有使用控件来显示结果，而是直接写在窗体上，故需要强制刷新窗口来显示结果。显示的工作由窗体的paint事件函数来完成，之所以保存结果来刷新，是因为如果直接在该处调用g.DrawString来写结果，一旦窗口被遮挡住，再次打开的时候，原本写上去的文字会被擦掉。
            //}

            //Graphics g = e.Graphics;
            //g.Clear(this.BackColor);
            //g.DrawString(output, this.Font, new SolidBrush(Color.Green), 0, 50);
           /* foreach (string ip in ips)
            {
                string ipstr = ip.Trim();
                if (!string.IsNullOrEmpty(ipstr))
                {
                    System.Diagnostics.Process p = new System.Diagnostics.Process();
                    p.StartInfo.FileName = "cmd.exe";
                    p.StartInfo.UseShellExecute = false;    //是否使用操作系统shell启动
                    p.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息
                    p.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息
                    p.StartInfo.RedirectStandardError = true;//重定向标准错误输出
                    p.StartInfo.CreateNoWindow = true;//不显示程序窗口
                    p.Start();//启动程序

                    ////向cmd窗口发送输入信息
                    ////p.StandardInput.WriteLine("sqlplus dms/dms@172.15.56.13/orcl");
                    ////p.StandardInput.WriteLine("ipconfig /all" + "&exit");
                    //string str = "sqlplus dms/dms@172.15.56.13/orcl\n" + sql + "&exit";
                    //string str = "sqlplus dms/dms@172.15.56.13/orcl\n" + sql + "&exit";
                    string str = "ECHO OFF\r\ncd c:\\\r\nc:\r\n";
                    str += string.Format("sqlplus dms/dmsbsj123@{0}/orcl  > \\SQLLOGS\\{1}SQL.txt\r\n",ip,ip);
                    str += sql;
                    Log.LogText(str);
                    p.StandardInput.WriteLine(str);
                    //p.WaitForExit();
                    //p.Close();
                    Log.LogText(ip + "SQL执行完毕,日志文件C:\\SQLLOGS");
                }
            }
            */

            //string str = "ipconfig /all";

            
            ////p.StandardInput.WriteLine("&exit");
            ////p.StandardInput.WriteLine(sql);
            ////p.StandardInput.WriteLine("&exit");

            //p.StandardInput.AutoFlush = true;
            ////p.StandardInput.WriteLine("exit");
            ////向标准输入写入要执行的命令。这里使用&是批处理命令的符号，表示前面一个命令不管是否执行成功都执行后面(exit)命令，如果不执行exit命令，后面调用ReadToEnd()方法会假死
            ////同类的符号还有&&和||前者表示必须前一个命令执行成功才会执行后面的命令，后者表示必须前一个命令执行失败才会执行后面的命令

            //p.BeginOutputReadLine();
            //p.WaitForExit();
            ////获取cmd窗口的输出信息
            //string output = p.StandardOutput.ReadToEnd();
            //string output = p.StandardError.ReadToEnd();
            //p.WaitForExit();

            ////StreamReader reader = p.StandardOutput;
            ////string line=reader.ReadLine();
            ////while (!reader.EndOfStream)
            ////{
            ////    str += line + "  ";
            ////    line = reader.ReadLine();
            ////}

            //p.WaitForExit();//等待程序执行完退出进程
            //p.Close();

            //Log.LogText(output);
            //Console.WriteLine(output);
        }
    }
}
